package coreBiz

import (
	"bytes"
	"compress/zlib"
	"fmt"
	"io/ioutil"
	"regexp"
)

// FileEncrypt 文件加密解密工具
type FileEncrypt struct {
}

// NewFileEncrypt 创建文件加密实例
func NewFileEncrypt() *FileEncrypt {
	return &FileEncrypt{}
}

// DecryptData 解密内存中的数据，不写入文件
// data: 源数据
// password: 密码
// 返回: 解密后的数据, 文件名, 错误信息
func (fe *FileEncrypt) DecryptData(data []byte, password string) ([]byte, string, error) {
	// 解压缩
	reader := bytes.NewReader(data)
	zlibReader, err := zlib.NewReader(reader)
	if err != nil {
		return nil, "", fmt.Errorf("解压数据失败: %s", err.Error())
	}
	defer zlibReader.Close()

	decompressed, err := ioutil.ReadAll(zlibReader)
	if err != nil {
		return nil, "", fmt.Errorf("读取解压数据失败: %s", err.Error())
	}

	// 使用正则表达式解析解密后的数据
	pattern := fmt.Sprintf(`^@@_____%s@@_____(.*?)@@_____`, regexp.QuoteMeta(password))
	re := regexp.MustCompile(pattern)
	matches := re.FindSubmatch(decompressed)

	if len(matches) < 2 {
		return nil, "", fmt.Errorf("解密出错: 密码错误或格式不正确")
	}

	// 提取文件名和内容
	filename := string(matches[1])

	// 提取文件内容
	content := re.ReplaceAll(decompressed, []byte(""))

	return content, filename, nil
}
